<?php

class FinanceiroController extends Controller {

    /**
    * @final   pacote das views deste controller
    */
    const PACKAGE_VIEW = 'financeiro';

    /**
     * @var FinanceiroService
     */
    private $financeiroService;
    /**
     * @var ClienteService
     */
    private $clienteService;
    /**
     * @var LancamentoService
     */
    private $lancamentoService;
    /**
     * @var HistoricoSituacaoService
     */
    private $historicoSituacaoService;
    /**
     * @var PlanoService
     */
    private $planoService;

    public function __construct() {
        $this->financeiroService = FinanceiroService::getInstance();
        $this->clienteService = ClienteService::getInstance();
        $this->lancamentoService = lancamentoService::getInstance();
        $this->historicoSituacaoService = HistoricoSituacaoService::getInstance();
        $this->planoService = PlanoService::getInstance();
    }

    public function filter() {
        $filterType = treatUrl('type');
        $IDFilter = $_POST['filterkey'];
        multipleEntities($IDFilter);

        $ArCustomerList = $this->historicoSituacaoService->findCustomerBySituationFilter($IDFilter, $filterType);

        $this->save(SESSION_INTERFACE, 'CustomerList', $ArCustomerList);

        $this->view('customersituationtablelist', self::PACKAGE_VIEW, true);
    }

    public function estornar() {
        $this->save(SESSION_INTERFACE, 'CustomerList', $this->clienteService->findAll());
        $this->view('estornar_listar', self::PACKAGE_VIEW);
    }

    public function estornarCliente() {
        $IDFinanceiro=treatUrl('id');
        multipleEntities($IDFinanceiro);
        $this->save(SESSION_INTERFACE, 'Customer', $this->clienteService->findbyFinancial($IDFinanceiro));
        $this->view('estornar_cliente', self::PACKAGE_VIEW);
    }

    public function executarEstorno() {
        $ArDados = $_POST;

        if( empty($ArDados['FoValor']) ) {
            $this->saveReturn('O campo "Valor" não foi preenchido.');
        } else if( empty($ArDados['DtData']) ) {
            $this->saveReturn('O campo "Data" não foi preenchido.');
        } else if( empty($ArDados['IDFinanceiro']) ) {
            $this->saveReturn('O campo "IDFinanceiro" não foi recebido.');
        }

        if( !$this->hasReturn() ) {
            $ArDados['DtData'] = dateBRtoBD($ArDados['DtData']);
            if( $this->financeiroService->reverse($ArDados) ) {
                $this->saveReturn('Estorno realizado com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao realizar o Estorno.');
            }
        }

        $this->showJsonResponse();
    }

    public function lancarPagamento() {
        $this->save(SESSION_INTERFACE, 'CustomerList', $this->clienteService->findWithPendingMonthly());
        $this->save(SESSION_INTERFACE, 'Title', 'Cliente com Lançamentos Pendentes');
        $this->view('lancar_pagamento_listar', self::PACKAGE_VIEW);
    }

    public function lancarPagamentoCliente() {
        $IDFinanceiro = treatUrl('id');
        $this->save(SESSION_INTERFACE, 'Customer', $this->clienteService->findByFinancial($IDFinanceiro));
        $this->save(SESSION_INTERFACE, 'PendingPaymentList', $this->financeiroService->findPendingPaymentsByFinancial($IDFinanceiro));
        $this->view('lancar_pagamentos', self::PACKAGE_VIEW);
    }

    public function executarLancamento() {
        $ArDados = $_POST;

        if( empty($ArDados['IDFinanceiro']) ) {
            $this->saveReturn('O Campo IDFinanceiro não foi Enviado');
        } else {
            foreach($ArDados['Payments'] as $IDPayment => &$ArPayment) {
                $ArPayment['DtData'] = dateBRtoBD($ArPayment['DtData']);
                $ArPayment['FoValor'] = MathUtils::moneyToDouble($ArPayment['FoValor']);
                if( empty($ArPayment['FoValor']) ) {
                    $this->saveReturn('Problemas ao Receber o campo "Valor" do Id: ' . $IDPayment);
                } else if( empty($ArPayment['DtData']) ) {
                    $this->saveReturn('Problemas ao Receber o campo "Data" do Id: ' . $IDPayment);
                } else if( empty($ArPayment['EnTipoPagamento']) ) {
                    $this->saveReturn('Problemas ao Receber o campo "Tipo Pagamento" do Id: ' . $IDPayment);
                } else if( !Validation::Date($ArPayment['DtData'], 'y-m-d') ) {
                    $this->saveReturn('Problemas com a Formata&ccedil;&atilde;o o campo "Data" do Id: ' . $IDPayment);
                } else if( strtotime($this->lancamentoService->findById($IDPayment)->getDtData()) > strtotime($ArPayment['DtData']) ) {
                    $this->saveReturn('O Pagamento com ID "' . $IDPayment . '" tem uma data de lançamento superior a data marcada como confirmada.');
                }
            }
        }
        if( !$this->hasReturn() ) {
            if( $this->financeiroService->releasePayment($ArDados) ) {
                $this->saveReturn('Pagamento(s) realizado(s) com sucesso', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao realizar o debito de 1 ou mais pagamentos');
            }
        }

        $this->showJsonResponse();
    }

    public function inadimplencia() {
        $ArDelinquentsCustomersId = $this->historicoSituacaoService->findDelinquentCustomer();
        $this->save(SESSION_INTERFACE, 'CustomerList', $this->clienteService->findCustomersWithId($ArDelinquentsCustomersId));
        $this->save(SESSION_INTERFACE, 'Title', 'Listar Cliente Inadimplêntes');
        $this->view('lancar_pagamento_listar', self::PACKAGE_VIEW);
    }

    public function relatorioInadimplentes() {
        $this->save(SESSION_INTERFACE, 'CustomerReport', $this->financeiroService->generateDelinquentReport());
        $this->save(SESSION_INTERFACE, 'HeadLineCustomerReport', $this->financeiroService->generateHeadLineDelinquentReport());
        $this->view('relatorio_inadimplentes', self::PACKAGE_VIEW);
    }

    public function relatorioPagamentos() {
        $this->save(SESSION_INTERFACE, 'PaymentReport', $this->financeiroService->generatePaymentReport());
        $this->view('relatorio_pagamentos', self::PACKAGE_VIEW);
    }

    public function listarClientes() {
        $this->save(SESSION_INTERFACE, 'CustomerList', $this->clienteService->findAll());
        $this->view('listar_clientes_editar_dados_financeiro', self::PACKAGE_VIEW);
    }

    public function editarDadosFinanceiro() {
        $IDFinanceiro = treatUrl('id');
        multipleEntities($IDFinanceiro);
        $this->save(SESSION_INTERFACE, 'Customer', $this->clienteService->findByFinancial($IDFinanceiro));
        $this->save(SESSION_INTERFACE, 'PlansList', $this->planoService->findAll());
        $this->view('editar_dados_financeiro', self::PACKAGE_VIEW);
    }

    public function atualizarDadosFinanceiro() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['IDPlano']) ) {
            $this->saveReturn('O Campo "Plano" não foi recebido.');
        } else if( empty($ArDados['EnTipoPagamento']) ) {
            $this->saveReturn('O Campo "Tipo de Pagamento" não foi recebido.');
        } else if( empty($ArDados['EnPeriodicidade']) ) {
            $this->saveReturn('O Campo "Periodicidade" não foi recebido.');
        } else if( !is_integer((int) $ArDados['ItDesconto']) ) {
            $this->saveReturn('O Campo "Desconto" não foi recebido corretamente.');
        } else if( empty($ArDados['IDFinanceiro']) ) {
            $this->saveReturn('O identificado não foi recebido.');
        }

        if( !$this->hasReturn() ) {
            if( $this->financeiroService->updateFinancialData($ArDados) ) {
                $this->saveReturn('Dados atualizados com Sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao atualizados os dados financeiro!');
            }
        }

        $this->showJsonResponse();

    }

}

?>

